package com.sisgesbyte.dao.administracion;

import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.PrecioProductoRequest;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.administracion.PrecioProductoEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoPrecioProductoDaoImpl extends AbstractFacade<PrecioProductoEntity> implements MantenimientoPrecioProductoDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantenimientoPrecioProductoDaoImpl() {
		super(PrecioProductoEntity.class);
	}

	
	@Override
	public List<PrecioProductoEntity> listaPrecioProductos( FiltrosSQLBean cadenaFiltros) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT pp.id, pp.categoria_cliente_id,cc.categoria categoria_cliente, pp.producto_id,p.cod_prod,p.producto,  ");
		jpql.append("pp.precio_normal, pp.tipo_campana_id, tc.descripcion campania ,pp.precio_campana, ");
		jpql.append("pp.almacen_id,a.cod_almacen, p.imagen , pp.active ");
		jpql.append("FROM administracion.precio_producto pp ");
		jpql.append("inner join administracion.categoria_cliente cc on  pp.categoria_cliente_id=cc.id ");
		jpql.append("inner join administracion.producto p on pp.producto_id=p.id ");
		jpql.append("left join administracion.tipo_campana tc on pp.tipo_campana_id=tc.id  ");
		jpql.append("inner join logistica.almacen a on pp.almacen_id=a.id ");
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(), PrecioProductoEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<PrecioProductoEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericEntity guardarPrecioProducto(PrecioProductoRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT *  from administracion.sp_registrar_precio_producto(:in_categoria_cliente_id, :in_producto_id, :in_precio_normal, :in_tipo_campana_id, ");
		jpql.append(":in_precio_campana, :in_almacen_id, :in_active) ");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_categoria_cliente_id", request.getCategoriaClienteId());
		query.setParameter("in_producto_id", request.getProductoId());
		query.setParameter("in_precio_normal", request.getPrecioNormal());
		query.setParameter("in_tipo_campana_id", request.getTipoCampanaId());
		query.setParameter("in_precio_campana", request.getPrecioCampana());
		query.setParameter("in_almacen_id", request.getAlmacenId());
		query.setParameter("in_active", request.getActive());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarPrecioProducto(PrecioProductoRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT *  from administracion.sp_actualizar_precio_producto(:in_id,:in_categoria_cliente_id, :in_producto_id, :in_precio_normal, :in_tipo_campana_id, ");
		jpql.append(":in_precio_campana, :in_almacen_id, :in_active) ");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		
		query.setParameter("in_id", request.getId());
		query.setParameter("in_categoria_cliente_id", request.getCategoriaClienteId());
		query.setParameter("in_producto_id", request.getProductoId());
		query.setParameter("in_precio_normal", request.getPrecioNormal());
		query.setParameter("in_tipo_campana_id", request.getTipoCampanaId());
		query.setParameter("in_precio_campana", request.getPrecioCampana());
		query.setParameter("in_almacen_id", request.getAlmacenId());
		query.setParameter("in_active", request.getActive());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarPrecioProducto(int codPrecioProducto) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_eliminar_precio_producto(:in_id)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", codPrecioProducto);

		return (GenericEntity) query.getSingleResult();
	}

}
